package com.wjm.api.LambdaPackage;

/**
 * Data:2022年07月28日
 * Author:wjm
 * Content: Lambda表达式（jdk1.8才引进）
 *
 *
 *  Lambda表达式的标准格式:
 *         三段式：
 *               1）一些参数
 *               2）一个箭头
 *               3）一段代码
 *
 *   表达式：(参数类型  参数名称) -> {需要执行的代码}
 *         说明：
 *               1）小括号内有多个参数则用逗号隔开，无参数则空白
 *               2）-> 这个表示将括号中的参数传入后面的逻辑代码中
 *               3）{} 这个里面是要存放需要执行的代码逻辑
 *
 *   使用要求：
 *         1）使用Lambda必须具有接口，且要求接口中只有一个抽象方法
 *         2）使用Lambda必须具备‘上下文推断’。即方法的参数类型或局部变量类型必须是Lambda对应的接口类型
 *
 *   省略规则：
 *         1）小括号内的参数类型是可以省略的
 *         2）如果小括号内只有一个参数，则小括号可以省略
 *         3）如果大括号内有且只有一个语句，则无论是否有返回值，都是可以省略大括号的（有返回值，return也可省略）
 *
 *   总结：
 *         以创建线程为例，Lambda表达式不需要管你要不要去实现什么接口或者其他一些七七八八的东西，
 *         它只需要管你最终要执行的东西，就像创建线程时你要去实现Runnable接口，最终的目的就是为
 *         了去重写run方法然后执行run方法中的代码，所以Lambda表达式只关注run方法，Lambda表达
 *         式的格式：()->{},其中()中放run方法需要的参数，然后在写一个箭头，最后在{}中放入run方
 *         法需要执行的代码
 *
 */
public class LambdaDemo {
    public static void main(String[] args) {
        //正常的创建线程，并启动线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是一个新线程，我启动了");
            }
        }).start();

        //TODO 使用Lambda表达式创建线程，并启动
        new Thread(()->{System.out.println("我是一个Lambda表达式创建的新线程，我启动了");}).start();

        //代码只有一句话的时候{}是可以去掉的
        new Thread(()->System.out.println("我是一个Lambda表达式优化后的线程，我启动了")).start();

        System.out.println("------------------------------------------");


    }
}

